home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 4 / Meeting Pearls Vol. IV (1996)(GTI - Schatztruhe)[!].iso / Pearls / dev / Monitor / Snoopy / Support / tasklist.c < prev    next >
C/C++ Source or Header  |  1993-12-21  |  2KB  |  110 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <proto/exec.h>
  5. #include <dos/dos.h>
  6. #include <dos/dosextens.h>
  7. #include <exec/execbase.h>
  8.  
  9. char *ver="\0$VER: tasklist Snoopy Support Tool 1.1 (01.01.94)";
  10. extern struct ExecBase *SysBase;
  11.  
  12. #define TYPE_TASK       0
  13. #define TYPE_PROCESS    1
  14.  
  15. #define IS_CURRENT      0
  16. #define IS_READY        1
  17. #define IS_WAITING      2
  18.  
  19. char *GetTaskName( struct Task *t, int *type )
  20. {
  21.     if( t->tc_Node.ln_Type == NT_PROCESS )
  22.     {
  23.         struct Process *p = (struct Process *)t;
  24.         struct CommandLineInterface *cli;
  25.         static char buffer[256];
  26.         char *cp,*dp;
  27.         int i;
  28.  
  29.         if( p->pr_TaskNum == 0 )
  30.             return t->tc_Node.ln_Name;
  31.  
  32.         cli = BADDR( p->pr_CLI );
  33.         cp = BADDR( cli->cli_CommandName );
  34.         dp = buffer;
  35.  
  36.         for( i=*cp++; i; i-- )
  37.         {
  38.             *dp++ = *cp++;
  39.         }
  40.         *dp=0;
  41.         *type = TYPE_PROCESS;
  42.         return buffer;
  43.     }
  44.  
  45.     *type = TYPE_TASK;
  46.     return t->tc_Node.ln_Name;
  47. }
  48.  
  49. struct ti
  50.     {
  51.         struct ti *next;
  52.         char *message;
  53.         int type,mode;
  54.         void *addr;
  55.     };
  56.  
  57. struct ti *anchor = NULL;
  58.  
  59. void AddTaskInfo( struct Task *t, int mode )
  60. {
  61.     struct ti *n;
  62.  
  63.     if( ( n = (struct ti *)calloc( 1, sizeof( struct ti ) ) ) != NULL )
  64.     {
  65.         n->next = anchor;
  66.         anchor = n;
  67.         n->mode = mode;
  68.         n->message = strdup( GetTaskName( t, &(n->type) ) );
  69.         n->addr = t;
  70.     }
  71.  
  72. char *types[] =
  73.     {
  74.         "TASK    ",
  75.         "PROCESS "
  76.     };
  77.  
  78. char *modes[] =
  79.     {
  80.         "CURRENT ",
  81.         "READY   ",
  82.         "WAITING "
  83.     };
  84.  
  85. void main( void )
  86. {
  87.     struct Node *np;
  88.     struct ti *ptr;
  89.  
  90.     Forbid();
  91.     AddTaskInfo( SysBase->ThisTask, IS_CURRENT );
  92.     for( np = SysBase->TaskReady.lh_Head;
  93.          np != (struct Node *)&(SysBase->TaskReady.lh_Tail);
  94.          np = np->ln_Succ )
  95.     {
  96.         AddTaskInfo( (struct Task *)np, IS_READY );
  97.     }
  98.     for( np = SysBase->TaskWait.lh_Head;
  99.          np != (struct Node *)&(SysBase->TaskWait.lh_Tail);
  100.          np = np->ln_Succ )
  101.     {
  102.         AddTaskInfo( (struct Task *)np, IS_WAITING );
  103.     }
  104.     Permit();
  105.     
  106.     for( ptr=anchor; ptr != NULL; ptr = ptr->next )
  107.         printf( "%08lx %s%s\"%s\"\n", ptr->addr, modes[ptr->mode], types[ptr->type], ptr->message );
  108. }
  109.